package com.example.designpattern.responsibility_two;

import com.example.model.GoodsDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * @author long
 * @date 2024/4/20 11:18
 */
public abstract class AbstractValidator implements IValidator{

    protected final Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 下一个节点
     */
    protected IValidator next;

    @Override
    public IValidator setNext(IValidator next) {
        this.next = next;
        return next;
    }

    @Override
    public void validate(GoodsDTO dto) {

        // 前置处理
        preValidate(dto);

        // 真正的校验逻辑
        doValidate(dto);

        // 后置处理
        postValidate(dto);

        // 如果下一个校验器不为空，则传递给下一个节点
        if(next != null){
            next.validate(dto);
        }
    }

    /**
     * 校验前置处理
     */
    protected void preValidate(GoodsDTO dto){

    }

    /**
     * 真正的校验逻辑交给子类实现 for subClass
     * @param dto
     */
    protected abstract void doValidate(GoodsDTO dto);

    /**
     * 校验后置处理
     */
    protected void postValidate(GoodsDTO dto){

    }

}
